// *************************************
// * Creator:SunnyPaine
// * DateTime:2024/09/04 09:09:22
// * Description:<Description>
// * CopyRight:
// * ***********************************

using System;

namespace SunnyPaine.Autofac.Extension.Mvvm.ViewCore
{
    /// <summary>
    /// 提供可以从IOC中获取视图实例的上下文。
    /// </summary>
    public interface IViewContext
    {
        /// <summary>
        /// 获得一个窗口实例，该实例如果已经存在，则获取实例的单例。
        /// </summary>
        /// <param name="name">窗口的名称。</param>
        /// <returns></returns>
        IWindow Resolve(string name);

        /// <summary>
        /// 获取视图实例。当视图已经存在，则返回它的单例，否则重新创建一个新的实例。
        /// </summary>
        /// <param name="name">视图的名称。</param>
        /// <param name="paras">
        /// 构造方法的参数。
        /// <para>注意：由于该方法获取视图是以单例模式执行，所以构造方法参数只有在第一次获取实例时会生效执行，从第二次获取实例开始，构造方法参数及时发生了变化也不再生效。</para>
        /// </param>
        /// <returns>返回视图的实例。</returns>
        IWindow Resolve(string name, Tuple<string, object>[] paras);

        /// <summary>
        /// 获取一个窗口实例，该实例始终为一个新的实例。
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        IWindow ResolveNew(string name);

        /// <summary>
        /// 获取视图实例。它将总是获取一个新的实例，而不是单例。
        /// </summary>
        /// <param name="name">视图的名称。</param>
        /// <param name="paras">构造方法的参数。</param>
        /// <returns>返回视图的实例，它将总是一个新的实例。</returns>
        IWindow ResolveNew(string name, Tuple<string, object>[] paras);

        /// <summary>
        /// 获得一个组件实例。
        /// </summary>
        /// <param name="name">组件的名称。</param>
        /// <returns></returns>
        IControl ResolveControl(string name);

        /// <summary>
        /// 获取视图组件实例。它将总是获取一个新的实例，而不是单例。
        /// </summary>
        /// <param name="name">视图组件的名称。</param>
        /// <param name="paras">构造方法的参数。</param>
        /// <returns>返回视图组件实例。它将总是一个新的实例。</returns>
        IControl ResolveControl(string name, Tuple<string, object>[] paras);
    }
}